home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
speak
/
src
/
muno.bas
< prev
next >
Wrap
BASIC Source File
|
1993-07-08
|
5KB
|
139 lines
1000 '==============================================================
1010 ' おしゃべり 人工無能!
1020 '==============================================================
1030 DEFINT A-Z
1035 MAX=1000:RANDOMIZE TIME
1045 DIM WORD$(50),BUNSYO$(MAX),TANGO$(MAX),KANKEI(MAX,5)
1050 SCREEN @0:CONSOLE 2,22,2
1080 LOCATE 0,0:PRINT "*** おしゃべり人工無能! ***":LOCATE 0,2
1085 '
1090 JYOSI$="は,が,の,には,から,より,を,も,ため,に,のは"
1100 JYOGAI$=JYOSI$+",なんだ,なのだ,のだ,のさ,です,でした,である,だね,だよ"
1110 JYOGAI$=JYOGAI$+",だぞ,だった,って,され,される,された,されてる,こと"
1120 JYOGAI$=JYOGAI$+",する,している,してる,させる,させた,します,しましょう"
1130 GOSUB *読み込み
1140 '
2000 '--------------------------------------------------------------
2010 ' メインルーチン
2020 '--------------------------------------------------------------
2030 ENDFLG=0
2040 ANS$="こんにちは":GOSUB *表示:GOSUB *話聞く
2050 *MAIN
2060 GOSUB *文の要素を分析
2070 GOSUB *答える
2080 IF ENDFLG=0 THEN *MAIN
2090 '
2100 *BYE
2110 GOSUB *書き込み
2120 END
2130 '
2140 *表示
2150 COLOR 6:PRINT "わたし:"+ANS$:COLOR 7
2160 'SPK$=ANS$:GOSUB *おしゃべり
2170 RETURN
2180 '
2190 '--------------------------------------------------------------
2200 ' 対話ルーチン
2210 '--------------------------------------------------------------
2220 *話聞く
2230 PRINT "あなた:";: LINE INPUT MES$
2240 IF MES$="" THEN ENDFLG=1
2250 RETURN
2260 '
2270 *答える
2280 IF MES$="" THEN RETURN
2290 IF RND>.9! AND SHUGO$<>"" THEN OBJ$=SHUGO$:GOTO 2310
2300 OBJ$=WORD$(INT(RND*WMAX))
2310 ID=SEARCH(TANGO$,OBJ$)
2320 IF ID=-1 AND NEST_FLG=0 THEN *質問
2330 IF ID=-1 AND NEST_FLG=1 ANS$=MES$:GOTO 2360
2340 ANS$=BUNSYO$(KANKEI(ID,INT(KANKEI(ID,0)*RND+1)))
2350 IF RND<.4! THEN NEST_FLG=1:MES$=ANS$:GOTO 2370
2360 GOSUB *表示:GOSUB *話聞く:NEST_FLG=0
2370 RETURN
2380 '
2390 *質問
2400 ANS$="「"+OBJ$+"」って"
2410 IF INSTR("る,い",KRIGHT$(OBJ$,1))<>0 THEN ANS$=ANS$+"どういうこと?" ELSE ANS$=ANS$+"なに?"
2420 GOSUB *表示:GOSUB *話聞く:IF ENDFLG THEN 2470
2430 TANGO$(T_MAX)=OBJ$:GOSUB *新文登録
2440 '
2450 KANKEI(T_MAX,0)=1:KANKEI(T_MAX,1)=ID '答と既存知識を関連付ける
2460 GOSUB *新文関係登録:T_MAX=T_MAX+1
2470 RETURN
2480 '
2490 *文の要素を分析
2500 IF MES$="" THEN RETURN
2510 GOSUB *新文登録:GOSUB *新文関係登録
2520 '
2530 WMAX=0 '文節ごとに切る
2540 MES0$=AKCNV$(MES$)
2550 WHILE MES0$<>""
2560 I=KINSTR(MES0$," "):IF I=0 THEN I=KLEN(MES0$)+1:MES0$=MES0$+" "
2570 WORD2$(WMAX)=KLEFT$(MES0$,I-1)
2580 MES0$=KRIGHT$(MES0$,KLEN(MES0$)-I):WMAX=WMAX+1
2590 WEND
2600 '
2610 WCNT=1:SHUGO$="" '主語や補語を得る
2620 WHILE WCNT<WMAX AND SHUGO$=""
2630 IF INSTR(JYOSI$,WORD2$(WCNT))<>0 THEN SHUGO$=WORD2$(WCNT-1)
2640 WCNT=WCNT+1
2650 WEND
2660 '
2670 WCNT=0 '説明のつかない言葉を除外する
2680 FOR I=0 TO WMAX-1
2690 IF INSTR(JYOGAI$,WORD2$(I))<>0 OR KLEN(WORD2$(I))=1 THEN 2710
2700 WORD$(WCNT)=WORD2$(I):WCNT=WCNT+1
2710 NEXT
2720 WMAX=WCNT
2730 RETURN
2740 '
2750 *新文登録
2760 IF NEST_FLG<>0 THEN 2790
2770 ID=SEARCH(BUNSYO$,MES$)
2780 IF ID=-1:BUNSYO$(B_MAX)=MES$:ID=B_MAX:B_MAX=B_MAX+1
2790 RETURN
2800 '
2810 *新文関係登録
2811 IF NEST_FLG<>0 THEN 2880
2820 FOR I=1 TO T_MAX
2830 N=KANKEI(I,0)+1
2840 IF INSTR(MES$,TANGO$(I))=0 OR N>5 THEN 2870
2850 FOR J=1 TO KANKEI(I,0):DMY(J)=KANKEI(I,J):NEXT
2860 IF SEARCH(DMY,ID)=-1 THEN KANKEI(I,0)=N:KANKEI(I,N)=ID
2870 NEXT
2880 RETURN
2890 '
2900 '--------------------------------------------------------------
2910 ' データの読み書き
2920 '--------------------------------------------------------------
2930 *読み込み
2940 OPEN "I",#1,"SENT.DAT"
2950 INPUT #1,B_MAX
2960 FOR I=1 TO B_MAX:INPUT #1,BUNSYO$(I):NEXT
2970 CLOSE #1
2980 OPEN "I",#1,"WORD.DAT"
2990 INPUT #1,T_MAX
3000 FOR I=1 TO T_MAX
3010 INPUT #1,TANGO$(I)
3020 FOR J=0 TO 5
3030 INPUT #1,KANKEI(I,J)
3040 NEXT
3050 NEXT
3060 CLOSE #1
3070 RETURN
3080 '
3090 *書き込み
3100 KILL"sent.dat":KILL"word.dat"
3110 OPEN "O",#1,"SENT.DAT"
3120 WRITE #1,B_MAX-1
3130 FOR I=1 TO B_MAX-1:WRITE #1,BUNSYO$(I):NEXT
3140 CLOSE #1
3150 OPEN "O",#1,"WORD.DAT"
3160 WRITE #1,T_MAX-1
3170 FOR I=1 TO T_MAX-1
3180 WRITE #1,TANGO$(I),KANKEI(I,0),KANKEI(I,1),KANKEI(I,2),KANKEI(I,3),KANKEI(I,4),KANKEI(I,5)
3190 NEXT
3200 CLOSE #1
3210 RETURN